; generated by ARM C/C++ Compiler with , RVCT4.0 [Build 524] for uVision
; commandline ArmCC [--split_sections --debug -c --asm --interleave -oxl345_io_bb.o --depend=xl345_io_bb.d --device=DARMAD -I.\inc -I.\efsl-0.2.8\inc -I.\efsl-0.2.8\conf -IC:\Keil\ARM\INC\ADI -D__MICROLIB -D__KEIL__ xl345_io_bb.c]
                          ARM

                          AREA ||i.I2C_DELAY_M||, CODE, READONLY, ALIGN=2

                  I2C_DELAY_M PROC
;;;37     #define I2CDELAYLEN 0;
;;;38     void I2C_DELAY_M(){
000000  e12fff1e          BX       lr
;;;39     //  i2cDelayCount = I2CDELAYLEN;
;;;40     //  while(i2cDelayCount>=0)
;;;41     //    i2cDelayCount--;
;;;42     return;
;;;43     }
;;;44     
                          ENDP


                          AREA ||i.I2C_READ||, CODE, READONLY, ALIGN=2

                  I2C_READ PROC
;;;103    
;;;104    unsigned char I2C_READ(void){
000000  e3a02000          MOV      r2,#0
;;;105      unsigned char dataByte;
;;;106      int bitIndex;
;;;107      SDA_HIGH;
000004  e5120bd0          LDR      r0,[r2,#-0xbd0]
000008  e3c00302          BIC      r0,r0,#0x8000000
00000c  e3c00702          BIC      r0,r0,#0x80000
000010  e5020bd0          STR      r0,[r2,#-0xbd0]
;;;108      dataByte = 0x00;
000014  e1a00002          MOV      r0,r2
;;;109      for (bitIndex = 0;bitIndex<8;bitIndex++){
000018  e1a01002          MOV      r1,r2
                  |L2.28|
;;;110        dataByte <<= 1;
;;;111        I2C_DELAY_M(); 
;;;112        SCK_HIGH;
00001c  e5123bd0          LDR      r3,[r2,#-0xbd0]
000020  e1a00c80          LSL      r0,r0,#25             ;110
000024  e1a00c20          LSR      r0,r0,#24             ;110
000028  e3833301          ORR      r3,r3,#0x4000000
00002c  e3833701          ORR      r3,r3,#0x40000
000030  e5023bd0          STR      r3,[r2,#-0xbd0]
;;;113        if((GP1DAT & SDABIT) == SDABIT){
000034  e5123bd0          LDR      r3,[r2,#-0xbd0]
000038  e3130008          TST      r3,#8
;;;114          dataByte = dataByte | 0x1;
;;;115        }
;;;116        I2C_DELAY_M();
;;;117        SCK_LOW;
00003c  e5123bd0          LDR      r3,[r2,#-0xbd0]
000040  13800001          ORRNE    r0,r0,#1              ;114
000044  e3c33701          BIC      r3,r3,#0x40000
000048  e3833301          ORR      r3,r3,#0x4000000
00004c  e5023bd0          STR      r3,[r2,#-0xbd0]
000050  e2811001          ADD      r1,r1,#1              ;109
000054  e3510008          CMP      r1,#8                 ;109
000058  baffffef          BLT      |L2.28|
;;;118      }
;;;119      return(dataByte);
;;;120    }
00005c  e12fff1e          BX       lr
;;;121    
                          ENDP


                          AREA ||i.I2C_START||, CODE, READONLY, ALIGN=2

                  I2C_START PROC
;;;50     #define SDABIT  0x08
;;;51     void I2C_START(){
000000  e3a00000          MOV      r0,#0
;;;52       I2C_DELAY_M();
;;;53       SDA_LOW;
000004  e5101bd0          LDR      r1,[r0,#-0xbd0]
000008  e3c11702          BIC      r1,r1,#0x80000
00000c  e3811302          ORR      r1,r1,#0x8000000
000010  e5001bd0          STR      r1,[r0,#-0xbd0]
;;;54       I2C_DELAY_M();
;;;55       SCK_LOW;
000014  e5101bd0          LDR      r1,[r0,#-0xbd0]
000018  e3c11701          BIC      r1,r1,#0x40000
00001c  e3811301          ORR      r1,r1,#0x4000000
000020  e5001bd0          STR      r1,[r0,#-0xbd0]
;;;56     }
000024  e12fff1e          BX       lr
;;;57     
                          ENDP


                          AREA ||i.I2C_STOP||, CODE, READONLY, ALIGN=2

                  I2C_STOP PROC
;;;58     
;;;59     void I2C_STOP(){
000000  e3a00000          MOV      r0,#0
;;;60       SDA_LOW; 
000004  e5101bd0          LDR      r1,[r0,#-0xbd0]
000008  e3c11702          BIC      r1,r1,#0x80000
00000c  e3811302          ORR      r1,r1,#0x8000000
000010  e5001bd0          STR      r1,[r0,#-0xbd0]
;;;61       I2C_DELAY_M(); 
;;;62       SCK_HIGH; 
000014  e5101bd0          LDR      r1,[r0,#-0xbd0]
000018  e3811301          ORR      r1,r1,#0x4000000
00001c  e3811701          ORR      r1,r1,#0x40000
000020  e5001bd0          STR      r1,[r0,#-0xbd0]
;;;63       I2C_DELAY_M(); 
;;;64       SDA_HIGH; 
000024  e5101bd0          LDR      r1,[r0,#-0xbd0]
000028  e3c11302          BIC      r1,r1,#0x8000000
00002c  e3c11702          BIC      r1,r1,#0x80000
000030  e5001bd0          STR      r1,[r0,#-0xbd0]
;;;65       I2C_DELAY_M(); 
;;;66     }
000034  e12fff1e          BX       lr
;;;67     
                          ENDP


                          AREA ||i.I2C_WRITE||, CODE, READONLY, ALIGN=2

                  I2C_WRITE PROC
;;;67     
;;;68     void I2C_WRITE(unsigned char dataByte){
000000  e3a01000          MOV      r1,#0
;;;69       int bitIndex;
;;;70       for (bitIndex = 0;bitIndex<8;bitIndex++){
000004  e1a02001          MOV      r2,r1
                  |L5.8|
;;;71         if (dataByte & 0x80){ 
;;;72           SDA_HIGH;
000008  e5123bd0          LDR      r3,[r2,#-0xbd0]
00000c  e3100080          TST      r0,#0x80              ;71
;;;73         }else{ 
;;;74           SDA_LOW; 
000010  03c33702          BICEQ    r3,r3,#0x80000
000014  03833302          ORREQ    r3,r3,#0x8000000
000018  13c33302          BICNE    r3,r3,#0x8000000      ;72
00001c  13c33702          BICNE    r3,r3,#0x80000        ;72
000020  e5023bd0          STR      r3,[r2,#-0xbd0]
;;;75         } 
;;;76         dataByte <<= 1; 
;;;77         I2C_DELAY_M(); 
;;;78         SCK_HIGH; 
000024  e5123bd0          LDR      r3,[r2,#-0xbd0]
000028  e1a00c80          LSL      r0,r0,#25             ;76
00002c  e1a00c20          LSR      r0,r0,#24             ;76
000030  e3833301          ORR      r3,r3,#0x4000000
000034  e3833701          ORR      r3,r3,#0x40000
000038  e5023bd0          STR      r3,[r2,#-0xbd0]
;;;79         I2C_DELAY_M(); 
;;;80         SCK_LOW; 
00003c  e5123bd0          LDR      r3,[r2,#-0xbd0]
000040  e3c33701          BIC      r3,r3,#0x40000
000044  e3833301          ORR      r3,r3,#0x4000000
000048  e5023bd0          STR      r3,[r2,#-0xbd0]
00004c  e2811001          ADD      r1,r1,#1              ;70
000050  e3510008          CMP      r1,#8                 ;70
000054  baffffeb          BLT      |L5.8|
;;;81       }
;;;82       SDA_HIGH; 
000058  e5120bd0          LDR      r0,[r2,#-0xbd0]
00005c  e3c00302          BIC      r0,r0,#0x8000000
000060  e3c00702          BIC      r0,r0,#0x80000
000064  e5020bd0          STR      r0,[r2,#-0xbd0]
;;;83       I2C_DELAY_M(); 
;;;84       SCK_HIGH; 
000068  e5120bd0          LDR      r0,[r2,#-0xbd0]
00006c  e3800301          ORR      r0,r0,#0x4000000
000070  e3800701          ORR      r0,r0,#0x40000
000074  e5020bd0          STR      r0,[r2,#-0xbd0]
;;;85       I2C_DELAY_M(); 
;;;86       SCK_LOW; 
000078  e5120bd0          LDR      r0,[r2,#-0xbd0]
00007c  e3c00701          BIC      r0,r0,#0x40000
000080  e3800301          ORR      r0,r0,#0x4000000
000084  e5020bd0          STR      r0,[r2,#-0xbd0]
;;;87     }
000088  e12fff1e          BX       lr
;;;88     
                          ENDP


                          AREA ||i.i2cinit||, CODE, READONLY, ALIGN=2

                  i2cinit PROC
;;;122    
;;;123    void i2cinit(){
000000  e3a00000          MOV      r0,#0
;;;124      // set the GPIO pins to GPIO
;;;125      //p1.2 = scl
;;;126      //p1.3 = sda
;;;127      GP1CON = GP1CON & 0xffff00ff;
000004  e5101bfc          LDR      r1,[r0,#-0xbfc]
000008  e3c11cff          BIC      r1,r1,#0xff00
00000c  e5001bfc          STR      r1,[r0,#-0xbfc]
;;;128      //set clock high and SDA highZ
;;;129      GP1DAT = 0x04040000;
000010  e59f1004          LDR      r1,|L6.28|
000014  e5001bd0          STR      r1,[r0,#-0xbd0]
;;;130    }  
000018  e12fff1e          BX       lr
;;;131    
                          ENDP

                  |L6.28|
                          DCD      0x04040000

                          AREA ||i.xl345Read||, CODE, READONLY, ALIGN=2

                  xl345Read PROC
;;;147    
;;;148    void xl345Read(unsigned char count, unsigned char regaddr, unsigned char *buf){
000000  e92d40f0          PUSH     {r4-r7,lr}
000004  e1a06000          MOV      r6,r0
000008  e1a04001          MOV      r4,r1
00000c  e1a07002          MOV      r7,r2
;;;149      int i;
;;;150      /* send I2c start and the slave address, the the register address */
;;;151    #ifdef xdebug_printf_h_
;;;152      debug_printf("DEBUG @ line %d in file %s, read %d bytes from 0x%02x.\n", __LINE__, __FILE__,count, regaddr);
;;;153    #endif
;;;154    
;;;155      I2C_START();
000010  ebfffffe          BL       I2C_START
;;;156      I2C_WRITE(XL345_ALT_WRITE); /* read bit not set */
000014  e3a000a6          MOV      r0,#0xa6
000018  ebfffffe          BL       I2C_WRITE
;;;157      I2C_WRITE(regaddr);
00001c  e1a00004          MOV      r0,r4
000020  ebfffffe          BL       I2C_WRITE
;;;158      I2C_STOP();
000024  ebfffffe          BL       I2C_STOP
;;;159        // start and send the read command
;;;160      I2C_START();
000028  ebfffffe          BL       I2C_START
;;;161      I2C_WRITE(XL345_ALT_READ);
00002c  e3a000a7          MOV      r0,#0xa7
000030  ebfffffe          BL       I2C_WRITE
;;;162        
;;;163      for( i=0;i<count;i++ ){
000034  e3a04000          MOV      r4,#0
000038  e1a05004          MOV      r5,r4
00003c  ea00001e          B        |L7.188|
                  |L7.64|
;;;164        buf[i] = I2C_READ();
000040  ebfffffe          BL       I2C_READ
000044  e7c70004          STRB     r0,[r7,r4]
;;;165        if( i+1<count ){
000048  e2840001          ADD      r0,r4,#1
00004c  e1500006          CMP      r0,r6
;;;166          I2C_ACK_M();
000050  e5150bd0          LDR      r0,[r5,#-0xbd0]
000054  aa00000b          BGE      |L7.136|
000058  e3c00702          BIC      r0,r0,#0x80000
00005c  e3800302          ORR      r0,r0,#0x8000000
000060  e5050bd0          STR      r0,[r5,#-0xbd0]
000064  e5150bd0          LDR      r0,[r5,#-0xbd0]
000068  e3800301          ORR      r0,r0,#0x4000000
00006c  e3800701          ORR      r0,r0,#0x40000
000070  e5050bd0          STR      r0,[r5,#-0xbd0]
000074  e5150bd0          LDR      r0,[r5,#-0xbd0]
000078  e3c00701          BIC      r0,r0,#0x40000
00007c  e3800301          ORR      r0,r0,#0x4000000
000080  e5050bd0          STR      r0,[r5,#-0xbd0]
000084  ea00000b          B        |L7.184|
                  |L7.136|
;;;167        } else {
;;;168          /* end the burst read with a nack then stop */
;;;169          I2C_NACK_M();
000088  e3c00302          BIC      r0,r0,#0x8000000
00008c  e3c00702          BIC      r0,r0,#0x80000
000090  e5050bd0          STR      r0,[r5,#-0xbd0]
000094  e5150bd0          LDR      r0,[r5,#-0xbd0]
000098  e3800301          ORR      r0,r0,#0x4000000
00009c  e3800701          ORR      r0,r0,#0x40000
0000a0  e5050bd0          STR      r0,[r5,#-0xbd0]
0000a4  e5150bd0          LDR      r0,[r5,#-0xbd0]
0000a8  e3800301          ORR      r0,r0,#0x4000000
0000ac  e3800701          ORR      r0,r0,#0x40000
0000b0  e5050bd0          STR      r0,[r5,#-0xbd0]
;;;170          I2C_STOP();
0000b4  ebfffffe          BL       I2C_STOP
                  |L7.184|
0000b8  e2844001          ADD      r4,r4,#1              ;163
                  |L7.188|
0000bc  e1540006          CMP      r4,r6                 ;163
0000c0  baffffde          BLT      |L7.64|
;;;171        }
;;;172      }
;;;173    #ifdef debug_printf_h_
;;;174      short x1,y1,z1;
;;;175      //debug_printf("DEBUG @ line %d in file %s, %d  Bytes read from 0x%02x:", __LINE__, __FILE__,count, regaddr);
;;;176      if((count == 6) && (regaddr == XL345_DATAX0)){
;;;177        x1 = ( (int) (buf[0] | buf[1]<<8));
;;;178        y1 = ( (int) (buf[2] | buf[3]<<8));
;;;179        z1 = ( (int) (buf[4] | buf[5]<<8));
;;;180        debug_printf(" x = %d, y = %d, z = %d in mg\n",x1*4,y1*4,z1*4);	
;;;181      } else {
;;;182        for( i=0;i<count;i++ ){
;;;183          debug_printf(" 0x%02x\n",buf[i]);
;;;184        } 
;;;185        //debug_printf("\n");
;;;186      } 
;;;187    #endif
;;;188    }
0000c4  e8bd80f0          POP      {r4-r7,pc}
                          ENDP


                          AREA ||i.xl345Write||, CODE, READONLY, ALIGN=2

                  xl345Write PROC
;;;131    
;;;132    void xl345Write ( unsigned char count, unsigned char * buf) {
000000  e92d4070          PUSH     {r4-r6,lr}
000004  e1a06000          MOV      r6,r0
000008  e1a05001          MOV      r5,r1
;;;133      int i;
;;;134    #ifdef xdebug_printf_h_
;;;135        debug_printf("DEBUG @ line %d in file %s Bytes to write=%d\n", __LINE__, __FILE__,count);
;;;136    #endif
;;;137        I2C_START();
00000c  ebfffffe          BL       I2C_START
;;;138        I2C_WRITE(XL345_ALT_WRITE); /* sets a write to devAddr 0x53 */
000010  e3a000a6          MOV      r0,#0xa6
000014  ebfffffe          BL       I2C_WRITE
;;;139        for(i=0;i<count; i++) {
000018  e3a04000          MOV      r4,#0
00001c  ea000002          B        |L8.44|
                  |L8.32|
;;;140    	I2C_WRITE(buf[i]);
000020  e7d50004          LDRB     r0,[r5,r4]
000024  ebfffffe          BL       I2C_WRITE
000028  e2844001          ADD      r4,r4,#1              ;139
                  |L8.44|
00002c  e1540006          CMP      r4,r6                 ;139
000030  bafffffa          BLT      |L8.32|
;;;141          }
;;;142        I2C_STOP();
000034  e8bd4070          POP      {r4-r6,lr}
000038  eafffffe          B        I2C_STOP
;;;143    #ifdef xdebug_printf_h_
;;;144        debug_printf("DEBUG @ line %d in file %s, %d  Bytes written.\n", __LINE__, __FILE__,count);
;;;145    #endif
;;;146    }
;;;147    
                          ENDP


                          AREA ||.data||, DATA, ALIGN=2

                  i2cDelayCount
                          DCD      0x00000000
